<?php
namespace app\admin\controller;

use think\Controller;
use think\Cookie;
use think\Exception;
use think\Log;
use think\Db;

class Pay extends  Base
{

    /**
     *支付宝页面
     * @author wcy
     * @version 2017年5月9日14:56:06
     */
    public function zfbPage(){
       return view("zfbpage");
    }
    /**
     *支付宝支付
     * @author wcy
     * @version 2017年5月9日14:56:06
     */
    public function zfbPay(){
        require_once(VENDOR_PATH."Ailpay/alipay.config.php");
        require_once(VENDOR_PATH."Ailpay/lib/alipay_submit.php");
        //商户订单号，商户网站订单系统中唯一订单号，必填
        $out_trade_no = $_POST['WIDout_trade_no'];
        //订单名称，必填
        $subject = $_POST['WIDsubject'];
        //付款金额，必填
        $total_fee = $_POST['WIDtotal_fee'];
        //商品描述，可空
        $body = $_POST['WIDbody'];
        //构造要请求的参数数组，无需改动
        $parameter = array(
            "service"       => $alipay_config['service'],
            "partner"       => $alipay_config['partner'],
            "seller_id"  => $alipay_config['seller_id'],
            "payment_type"	=> $alipay_config['payment_type'],
            "notify_url"	=> $alipay_config['notify_url'],
            "return_url"	=> $alipay_config['return_url'],
            "anti_phishing_key"=>$alipay_config['anti_phishing_key'],
            "exter_invoke_ip"=>$alipay_config['exter_invoke_ip'],
            "out_trade_no"	=> $out_trade_no,
            "subject"	=> $subject,
            "total_fee"	=> $total_fee,
            "body"	=> $body,
            "_input_charset"	=> trim(strtolower($alipay_config['input_charset']))
        );
        //建立请求
        $alipaySubmit = new \AlipaySubmit($alipay_config);
        $html_text = $alipaySubmit->buildRequestForm($parameter,"get", "确认");
        echo $html_text;
    }
    /**
     *支付宝同步地址
     * @author wcy
     * @version 2017年5月9日14:56:06
     */
    public function zfbRuturnUrl(){
        require_once(VENDOR_PATH."Ailpay/alipay.config.php");
        require_once(VENDOR_PATH."Ailpay/lib/alipay_notify.php");
        $alipayNotify = new \AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyReturn();
        if($verify_result) {
            //验证成功
            //请在这里加上商户的业务逻辑程序代码
            //商户订单号
            $out_trade_no = $_GET['out_trade_no'];
            //支付宝交易号
            $trade_no = $_GET['trade_no'];
            //交易状态
            $trade_status = $_GET['trade_status'];

            if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
                //如果有做过处理，不执行商户的业务程序
            }
            else {
                echo "trade_status=".$_GET['trade_status'];
            }
            echo "验证成功<br />";
            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
        }
        else {
            //验证失败
            //如要调试，请看alipay_notify.php页面的verifyReturn函数
            echo "验证失败";
        }
    }
    /**
     *支付宝异步异地
     * @author wcy
     * @version 2017年5月9日14:56:06
     */
    public function zfbNotifyUrl(){
        require_once(VENDOR_PATH."Ailpay/alipay.config.php");
        require_once(VENDOR_PATH."Ailpay/lib/alipay_notify.php");
        //计算得出通知验证结果
        $alipayNotify = new \AlipayNotify($alipay_config);
        $verify_result = $alipayNotify->verifyNotify();
        if($verify_result) {//验证成功
            //请在这里加上商户的业务逻辑程序代
            //商户订单号
            $out_trade_no = $_POST['out_trade_no'];
            //支付宝交易号
            $trade_no = $_POST['trade_no'];
            //交易状态
            $trade_status = $_POST['trade_status'];
            if($_POST['trade_status'] == 'TRADE_FINISHED') {
                //判断该笔订单是否在商户网站中已经做过处理
            }
            else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
                //判断该笔订单是否在商户网站中已经做过处理
            }
            //——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
            echo "success";		//请不要修改或删除
        }
        else {
            //验证失败
            echo "fail";
            //调试用，写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
        }
    }
    /**
     *微信支付
     * @author wcy
     * @version 2017年5月9日14:56:06
     */
    public function wxPay(){
        require_once(VENDOR_PATH."Wx/lib/WxPay.Api.php");
        require_once(VENDOR_PATH."Wx/WxPay.NativePay.php");
        //模式二
        /**
         * 流程：
         * 1、调用统一下单，取得code_url，生成二维码
         * 2、用户扫描二维码，进行支付
         * 3、支付完成之后，微信服务器会通知支付成功
         * 4、在支付成功通知中需要查单确认是否真正支付成功（见：notify.php）
         */
        $notify = new \NativePay();
        $input = new \WxPayUnifiedOrder();
        $input->SetBody("test");//
        $input->SetAttach("test");
        $input->SetOut_trade_no(\WxPayConfig::MCHID.date("YmdHis"));
        $input->SetTotal_fee("1");
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("test");
        $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
        $input->SetTrade_type("NATIVE");
        $input->SetProduct_id("123456789");
        $result = $notify->GetPayUrl($input);
        $url = $result["code_url"];
        $this->assign("url",$url);
        return view("wxpage");
    }
    /**
     *微信异步通知
     * @author wcy
     * @version 2017年5月9日17:29:34
     */
    public function wxNotify($data, &$msg){
        require_once(VENDOR_PATH."Wx/lib/WxPay.Api.php");
        require_once(VENDOR_PATH."Wx/WxPay.Notify.php");
        $notfiyOutput = array();
        if(!array_key_exists("transaction_id", $data)){
            $msg = "输入参数不正确";
            return false;
        }
        //查询订单，判断订单真实性
        if(!$this->Queryorder($data["transaction_id"])){
            $msg = "订单查询失败";
            return false;
        }
        return true;
    }
    //查询订单
    public function Queryorder($transaction_id)
    {
        require_once "../lib/WxPay.Api.php";
        require_once '../lib/WxPay.Notify.php';
        $input = new \WxPayOrderQuery();
        $input->SetTransaction_id($transaction_id);
        $result = \WxPayApi::orderQuery($input);
        if(array_key_exists("return_code", $result)
            && array_key_exists("result_code", $result)
            && $result["return_code"] == "SUCCESS"
            && $result["result_code"] == "SUCCESS")
        {
            return true;
        }
        return false;
    }

    public function wxChange(){
        try{
            $money=$_POST["money"];
            require_once(VENDOR_PATH."Wx/lib/WxPay.Api.php");
            require_once(VENDOR_PATH."Wx/WxPay.NativePay.php");
            //模式二
            /**
             * 流程：
             * 1、调用统一下单，取得code_url，生成二维码
             * 2、用户扫描二维码，进行支付
             * 3、支付完成之后，微信服务器会通知支付成功
             * 4、在支付成功通知中需要查单确认是否真正支付成功（见：notify.php）
             */
            $notify = new \NativePay();
            $input = new \WxPayUnifiedOrder();
            $input->SetBody("苹果7 plus 64G");//商品描述
            $input->SetAttach("test");
            $input->SetOut_trade_no(\WxPayConfig::MCHID.date("YmdHis"));//商户订单号
            $input->SetTotal_fee($money);//金额 单位：分
            $input->SetTime_start(date("YmdHis"));//交易起始时间
            $input->SetTime_expire(date("YmdHis", time() + 600));//交易结束时间
            $input->SetGoods_tag("手机");//商品标记
            $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");//异步通知地址
            $input->SetTrade_type("NATIVE");//交易类型 trade_type=NATIVE时（即扫码支付），
            $input->SetProduct_id("123456789");//此参数必传。此参数为二维码中包含的商品ID，商户自行定义。
            $result = $notify->GetPayUrl($input);
            $url="http://paysdk.weixin.qq.com/example/qrcode.php?data=".$result["code_url"];;
            return json(["code"=>1,"url"=>$url]);
        }catch (Exception $e){
            Log::record($e->getMessage());
            return json(["code"=>-1,"msg"=>"微信支付二维码生成失败"]);
        }
    }
}